package com.tedu.day02.oop;

/**
 * 抽象类特点<补充/梳理>
 *                    类：成员变量/成员方法/构造方法
 *                 抽象类： 成员变量/成员方法/构造方法
 *                 创建抽象类---普通类变成（实现）子类---继承抽象类
 *                 成员变量：既可以是变量也可以是常量
 *                 构造方法：有，用于子类访问调用抽象【父】类的成员变量---赋值
 *                 成员方法：既可以抽象，非抽象
 *                 抽象方法与非抽象方法出现在抽象类问题
 *                 A：抽象方法   【重写】强制要求子类完成父类抽象方法
 *                 B：非抽象方法  【拓展】子类继承的事情，提高代码复用性
 */
 abstract class Foo{
    //成员变量
    public int i=10;
    public final int J=20;  //变成常量：标识符必须大写
    //Java强类型语言：大小写分明
    public int j=30;
    //构造方法:无参

    public Foo() {
        this(30);   //调用当前类对象的其他构造器
    }
    //构造方法:有参
    public Foo(int i) {
        this.i = 30;
    }
    //成员方法:抽象方法
    public abstract void show();
    //成员方法:非抽象方法
    public void method(){
        System.out.println("Foo    method");
    }
}
//实现{子}类
class Goo extends Foo{
     public Goo(){
         super();
     }

    public void show() {
        System.out.println("Goo    show");
    }
    public void method(){
        System.out.println("Goo  method");
    }
}
public class 抽象类补充知识点 {
    public static void main(String[] args) {
        //抽象类--继承---多态性---向上造型
        Foo f=new Goo();
        //①实例化：---子类构造器，默认存在无参构造器
        //在通过super（）调用父类无参构造器
        //②执行抽象类无参构造器，发现this（参数）调用本类其他有参数构造器
        //③this调用的同时完成抽象类中的  i  进行赋值   i=30
        System.out.println(f.i);   //输出   ：   i的值   i=30
        // f.J=40;  不可修改
        System.out.println(f.J);

        //-------------------------------------------------
        f.show();      //输出：Goo  show   重写
        f.method();    //输出：Goo  method   拓展【子类方法重写】
    }
}
/*拓展：abstract关键共存问题*/
abstract class Aoo{
   //public final abstract void show2();      冲突
    // private abstract void show1();    冲突
    //public static abstract void show3();    冲突
    //无意义：静态方法需要加语法块{}，抽象方法
}


